package com.hyper_yang._05_juc.chap09;

/**
 * 有序性 volatile 禁止 指令重排
 *  防止优化器 代码指令重排
 */
public class VolatileOrderDemo {

    static volatile int a, b; // a + volatile 禁止后续代码在前面执行; b同理
    static int x, y;

    //情况3：第245次打印：x=1, y=1     两个线程交叉执行。可能出现。
    //情况4：第112928次打印：x=0, y=0   出现x=0, y=0只能说明底层指令重排序。按照代码顺序不可能出现的。
    public static void main(String[] args) throws InterruptedException {

        int i = 0;
        while (true) {
            i++; //计数器，记录循环次数。
            a = b = x = y = 0;

            //情况1： thread1先执行  thread2后执行
            // a = 1  x = 0  b = 1  y = 1        x,y = [0,1]
            Thread thread1 = new Thread(() -> {
                a = 1;
                x = b;
            }, "");

            //情况2： thread2先执行  thread1后执行
            // b = 1  y = 0   a = 1    x = 1    x,y = [1,0]
            Thread thread2 = new Thread(() -> {
                b = 1;
                y = a;
            }, "");

            thread1.start();
            thread2.start();

            thread1.join();
            thread2.join();

            //第112928次打印：x=0, y=0   这种情况应该是底层指令重排序（目的优化）导致的结果！  如果不允许指令重排序，需禁用指令重排序(不需要优化)。
            System.out.println("第" + i + "次打印：x=" + x + ", y=" + y);

            if (x == 1 && y == 1) {
                break;
            }
        }
    }
}